package com.example.articletest.Dao;

import com.example.articletest.POJO.Comment;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;

//dao层，必须继承MongoRepository，指定POJO类Comment和主键类型
public interface CommentDao  extends MongoRepository<Comment,String> {
    //?不用写数据库交互代码？？Repository 自动实现机制
    /**
     * 自动方法实现----非常！！注意的就是命名规则---自动生成的方法名必须遵循 findBy[列名] 的命名规则（列名第一个字母大写，其他的与POJO类严格一致，区分大小写）
     * 继承 MongoRepository 后自动获得：
     * 基础 CRUD 操作---不需要额外声明
     * 分页查询---需要额外声明
     * 排序查询
     * 条件计数
     * 自动获得的方法命名规则：如 findByUserid 自动解析为 WHERE userid = ?
     * @Query 注解：直接编写 MongoDB JSON 查询语法
     */

    /**
     * 分页查询--需要额外声明
     * 方法名严格遵循 findBy[列名] 的命名规则（区分大小写）
     * 默认的分页查询方法的话必须携带参数 Pageable ，这个参数是 Spring Data 提供的一个接口，用于封装分页查询的相关信息，包括页码、每页大小、排序等。
     */
    // 自动分页查询（ByUserid注意方法名中的字段名必须与POJO字段完全一致，除了第一个字母大写，后面的与POJO的属性名保持一致）
    Page<Comment> findByUserid(String userId, Pageable pageable);

    // 带排序的分页查询
    Page<Comment> findByArticleidOrderByCreatedatetimeDesc(String articleId, Pageable pageable);

    //父id查询
    //根据父id，分页查询查询子评论---对应POJO中parentid字段---和上面的都一样
    Page<Comment> findByParentid(String parentid, Pageable pageable);

    //有些情况下，自动注入的方法可能无法满足需求，需要自定义查询方法，可以使用 @Query 注解来实现。
    //@Query 注解可以直接编写 MongoDB JSON 查询语法，实现复杂的查询操作。
    //@Query 注解的使用方法如下：
    //@Query("{字段名: ?0}")   //?0表示第一个参数，？什么意思？
    //List<Comment> findByUserid(String userId);




}
